'use strict'
import { app, protocol, BrowserWindow, BrowserView } from 'electron'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
import { winConfig, winListren, boundsConfig } from '@/config/win_config'
import { resolveS } from '@/config/path_config'
import { isDevelopment } from '@/config/env_config'
import { createMenu } from '@/config/menu_config'
import { createTray } from '@/config/tray_config'
import { getAuthOpen, removeAuthOpen, setAuthOpen } from '@/config/authopen_config'
import { initDownload } from '@/config/download_config'

const ElectronStore = require('electron-store')
const packageJson = require('../package.json')
const RemoteMain = require('@electron/remote/main')
let isfirst = true

async function createWindow () {
  const win = new BrowserWindow(winConfig) // 创建主进程
  const loadingBrowserView = new BrowserView() // 启动页加载
  win.setBrowserView(loadingBrowserView)
  // 设置远程连接
  RemoteMain.enable(win.webContents)

  loadingBrowserView.setBounds(boundsConfig(win))

  loadingBrowserView.webContents.loadURL(resolveS('loading.html') + '?version=' + packageJson.version)

  win.once('ready-to-show', () => {
    // 最大化
    win.maximize()
    // 显示
    win.show()
    // 储存库
    ElectronStore.initRenderer()
  })

  win.webContents.on('will-navigate', () => {
    win.setBrowserView(loadingBrowserView)
  })

  win.webContents.on('dom-ready', async (event) => {
    if (isfirst) {
      isfirst = false
      setTimeout(function () {
        win.removeBrowserView(loadingBrowserView)
      }, 2000)
    }
    else {
      win.setIgnoreMouseEvents(false);
      win.removeBrowserView(loadingBrowserView)
    }
  })

  if (process.env.WEBPACK_DEV_SERVER_URL) {
    await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
    if (!process.env.IS_TEST) win.webContents.openDevTools()
  }
  else {
    createProtocol('app')
    win.loadURL('app://./index.html')
  }
  // 创建托盘
  createTray(win)
  // 去创建菜单
  createMenu(win)
  // 监听窗口
  winListren(win, loadingBrowserView)
  // 获取自启状态
  getAuthOpen(win)
  // 下载
  initDownload(win)
}

// 在 Electron 中，浏览器窗口只能在app模块的 ready事件被触发后创建 您可以使用app.whenReady()API等待此事件 。createWindow()在whenReady() 解决其 Promise后调用。
app.whenReady().then(() => {
  createWindow()
})
// 当应用程序完成基本启动时发出
app.on('will-finish-launching', () => {
  // 自启事件
  setAuthOpen()
  removeAuthOpen()
})
// 当 Electron 完成初始化时发出一次
app.on('ready', () => {
  RemoteMain.initialize()
})
// 当所有窗口都关闭时发出。
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})
// 在应用程序开始关闭其窗口之前发出   --在 Windows 上，如果应用程序由于系统关闭/重新启动或用户注销而关闭，则不会发出此事件。
app.on('before-quit', () => {

})
// 在应用程序开始关闭其窗口之前发出  --在 Windows 上，如果应用程序由于系统关闭/重新启动或用户注销而关闭，则不会发出此事件。
app.on('will-quit', () => {

})
// 在应用程序开始关闭其窗口之前发出  --在 Windows 上，如果应用程序由于系统关闭/重新启动或用户注销而关闭，则不会发出此事件。
app.on('quit', () => {

})
// 当应用程序被激活时发出。各种操作都可以触发此事件
app.on('activate', () => {
  // 在macOS上，当单击dock图标并且没有其他窗口打开时，通常会在应用程序中重新创建一个窗口。
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow()
  }
})
// 在开发模式下，根据请求从父进程干净地退出
if (isDevelopment) {
  if (process.platform === 'win32') {
    process.on('message', (data) => {
      if (data === 'graceful-exit') {
        app.quit()
      }
    })
  }
 else {
    process.on('SIGTERM', () => {
      app.quit()
    })
  }
}

protocol.registerSchemesAsPrivileged([
  { scheme: 'app', privileges: { secure: true, standard: true } }
])
